perm filename HOSTAB.NEW[HST,NET] blob
sn#719191 filedate 1983-07-04 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00005 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 title HOSTAB Host table printer
C00010 00003 nout sout octout octou1 octou2
C00014 00004 hostab htbunm netprt nhashs skpntp
C00021 00005 onenet foo1 foo3 hstprt hstpr1 foo2 cpopj
C00029 ENDMK
C⊗;
title HOSTAB Host table printer
;Some kind person should rewrite this piece of shit
ifndef sailsw,sailsw==ife <.osmidas-sixbit/SAIL/>,[-1] .else 0
ifndef t20sw,t20sw==ife <.osmidas-sixbit/TWENEX/>,[-1] .else 0
;Cough bletch
ife sailsw\t20sw,.insrt MRC;MACROS
ifn sailsw,.insrt MACROS[1,MRC]
ifn t20sw,.insrt MACROS
;The format of the compiled HOSTS2 file is:
HSTSID==0 ; wd 0 SIXBIT /HOSTS2/
HSTFN1==1 ; wd 1 SIXBIT /HOSTS/ usually
HSTVRS==2 ; wd 2 FN2 of HOSTS file which this was compiled from.
HSTDIR==3 ; wd 3 SIXBIT /SYSENG/ usually, directory name of source file
HSTMCH==4 ; wd 4 SIXBIT /AI/ (e.g.), device name of source file
HSTWHO==5 ; wd 5 UNAME of person who compiled this
HSTDAT==6 ; wd 6 Date of compilation as sixbit YYMMDD
HSTTIM==7 ; wd 7 Time of compilation as sixbit HHMMSS
NAMPTR==10 ; wd 10 Address in file of NAME table.
SITPTR==11 ; wd 11 Address in file of SITE table.
NETPTR==12 ; wd 12 Address in file of NETWORK table.
;....expandable....
;NETWORK table
; wd 0 Number of entries in table.
; wd 1 Number of words per entry. (2)
;This table contains one entry for each network known about, sorted
;by network number. A network number is bits 4.8-4.1 of a network
;address; these numbers are assigned by Jon Postel. See symbols below.
;The reason for keeping track of different networks is that the user
;program must make different system calls to use each network.
;Each entry contains:
NETNUM==0 ; wd 0 network number
NTLNAM==1 ; wd 1 LH - address in file of name of network
NTRTAB==1 ; wd 1 RH - address in file of network's address table
;ADDRESS table(s)
; wd 0 Number of entries in table.
; wd 1 Number of words per entry. (2)
;There is one of these tables for each network. It contains entries
;for each site attached to that network, sorted by network address.
;These tables are used to convert a numeric address into a host name.
;Also, the list of network addresses for a site is stored
;within these tables.
;Each entry contains:
ADDADR==0 ; wd 0 Network address of this entry (including network number).
ADLSIT==1 ; wd 1 LH - address in file of SITE table entry
ADRCDR==1 ; wd 1 RH - address in file of next ADDRESS entry for this site
; 0 = end of list
;SITE table
; wd 0 Number of entries in table.
; wd 1 Number of words per entry. (3)
;This table contains entries for each network site,
;not sorted by anything in particular. A site can have more
;than one network address, usually on different networks.
;This is the main, central table.
;Each entry looks like:
STLNAM==0 ; wd 0 LH - address in file of official host name
STRADR==0 ; wd 0 RH - address in file of first ADDRESS table entry for this site
; successive entries are threaded together through ADRCDR
STLSYS==1 ; wd 1 LH - address in file of system name (ITS, TIP, TENEX, etc.)
; May be 0 => not known.
STRMCH==1 ; wd 1 RH - address in file of machine name (PDP10, etc.)
; May be 0 => not known.
STLFLG==2 ; wd 2 LH - flags:
STFSRV==400000 ; 4.9 1 => server site (according to NIC)
; wd 2 RH - not used
;NAMES table:
; wd 0 Number of entries
; wd 1 Number of words per entry. (1)
;This table is used to convert host names into network addresses.
; Followed by entries, sorted by the host name treated as a vector of
; signed integers, looking like:
NMLSIT==0 ; lh address in file of SITE table entry for this host.
NMRNAM==0 ; rh address in file of host name
;This name is official if NMRNAM = STLNAM of NMLSIT.
; All names are ASCIZ strings, all letters upper case.
; The strings are stored before, after and between the tables.
; All strings are word-aligned, and fully zero-filled in the last word.
;Network addresses are defined as follows, for purposes of this table:
; 4.9 0
; 4.8-4.1 network number
; Chaos net (number 7):
; 3.9-2.8 0
; 2.7-1.1 address (2.7-1.9 subnet, 1.8-1.1 host)
; Arpa net (number 12): (note, old-format Arpanet addresses
; 3.9-3.8 0 never appear in the host table.)
; 3.7-2.1 Imp
; 1.9 0
; 1.8-1.1 Host
; Dialnet (number 26):
; 3.9-3.1 0
; 2.9-1.1 address in file of ASCIZ string of phone number
NW%RCC==3 ;RCCnet
NW%CHS==7 ;Chaosnet
NW%ARP==12 ;Arpanet
NW%DLN==26 ;Dialnet
NW%LCS==22 ;LCSnet
NW%SU==44 ;SUnet
NW$BYT==331000 ;Byte pointer to network number
ife sailsw\t20sw,[
define TYPE string
move x,[point. 7,[ascii\string\]]
movx y,<.length\string\>
syscal SIOT,[ clarg. tto
%clarg x
%clarg y]
.lose %lssys
termin
]
ifn sailsw,[
define TYPE string
outstr [asciz\string\]
termin
]
ifn t20sw,[
define TYPE string
hrroi a1,[asciz\string\]
psout
termin
];ifn t20sw
acdef. [a1 a2 a3 a4 x y z a b c d tbl] ; accumulators
acdef. [tto htb] ; I/O channels
nd. pdllen==50. ; push down list length
ifn t20sw,.decsav ? loc 140
pdl: block pdllen ; push down list
;nout sout octout octou1 octou2
; I/O subroutines
; NOUT numeric output
; accepts in x: base to use for outputting the number
; y: number to be output
; returns: +1: always, with y and z clobbered
nout=call .
idivi y,(x) ; get a digit
save z ; save the lowest order digit left
caxe y,%zeros ; got them all?
nout ; nope
retr y ; get a digit to output
addx y,"0 ; convert to ASCII
ife sailsw\t20sw,.iot tto,y ; output it
ifn sailsw,outchr y ; output it
ifn t20sw,move a1,y ? pbout
return ; and return
; SOUT string output
; accepts in x: pointer to string (0 in LH means ASCIZ string)
; returns +1: always, with updated string pointer in x; 0 & y clobbered
sout=call .
txnn x,%lhalf ; is there a left half?
hrli x,440700 ; yes, make it a 7 bit pointer
movx y,%zeros ; initialize string counter
ife sailsw\t20sw,[
save x ; save pointer away
ildb x ; get a character
jumpn [aoja y,.-1] ; count character if non-null
retr x ; else restore pointer
movem y,strlen' ; save string length
syscal SIOT,[ clarg. tto ; output to TTY
%clarg x ; string pointer
%clarg y] ; byte counter
.lose %lssys ; ? ? ?
];ife sailsw\t20sw
ifn sailsw,[
ildb x
jumpn [outchr ? aoja y,.-1]
movem y,strlen' ; save string length
];ifn sailsw
ifn t20sw,[
ildb x
jumpn [move a1, ? pbout ? aoja y,.-1]
movem y,strlen' ; save string length
];ifn t20sw
return ; and return
;Right-justified octal from y, in x columns
;Bash x,z
octout: jffo y,.+1 ; haulong
subi z,36.
skipn z
movni z,1
subi z,2
push p,z+1
idivi z,3 ; z now has minus number of octal digits
pop p,z+1
add z,x ; z now has number of spaces
jumple z,octou2
octou1:
ife sailsw\t20sw,.iot tto,[" ]
ifn sailsw,outchr [" ]
ifn t20sw,movei a1,<" > ? pbout
sojg z,octou1
octou2: movx x,8. ; load up octal base
nout ; output it
return
ifn sailsw\t20sw,.lose=<jrst 4,>
;hostab htbunm netprt nhashs skpntp
; Start of program
hostab:
ifn sailsw,[
cai
reset
open [17 ? 'DSK,, ? 0] ; get a disk channel
.lose
dmove [sixbit/HOSTS2BIN/]
move 3,['HSTNET]
lookup ; find file HOSTS2.BIN[HST,NET]
.lose
movei 2,hsttab
movem 2,jobff
movs 3 ? movn ? addb jobff ; get address of highest addr we need
core ; get more core from system maybe
.lose
move 3 ? hrri -1(2) ; compute IOWD to read host table in
setz 1,
input
releas
];ifn sailsw
move p,[pdl(-pdllen)] ; load PDP
ife sailsw\t20sw,[
syscal OPEN,[ clctl. .uao ; open in single ASCII mode
clarg. tto ; TTY output channel
clarg. ('TTY)] ; the TTY
.lose %lsfil ; ? ? ?
syscal OPEN,[ clctl. .bai ; open in block ASCII mode
clarg. htb ; host table channel
clarg. ('DSK) ; device
clarg. 'HOSTS2 ; fn1
clarg. sixbit/>/; fn2
clarg. 'SYSBIN] ; sname
.lose %lsfil ; ? ? ?
move x,[-100.,,hsttab←-10.] ; 100. pages starting at HSTTAB
syscal CORBLK,[ clarg. %cbndr ; map pages, fail if can't get all
clarg. %jself ; this job
x ; pointer to pages to load
clarg. htb] ; channel
];ife sailsw\t20sw
ifn t20sw,[
movsi a1,(gj%old\gj%sht) ; try to access host table
hrroi a2,[asciz/SYSTEM:HOSTS2.BIN/]
gtjfn
.lose
movei a2,of%rd ; open up host table
openf
.lose
sizef ; get its size
.lose
movsi a1,(a1) ; map in host table starting at page 0
move a2,[.fhslf,,hsttab/1000]
hrli a3,(pm%cnt\pm%rd)
pmap
];ifn t20sw
skipn x,hsttab ; check first word of host table
.lose ; didn't read it all or bad?
caxe x,'HOSTS2 ; right first word?
.lose ; bad file?
type [Host table generated by ]
skipn x,hsttab+hstwho ; get UNAME of creator
.lose ; null UNAME?
htbunm: movx y,%zeros ; zap where character will go
rotc x,6 ; gobble a character
addx y,<" > ; ASCIIify
ife sailsw\t20sw,.iot tto,y ; output
ifn sailsw,outchr y
ifn t20sw,move a1,y ? pbout
jumpn x,htbunm ; continue if more
type [ on ]
skipn x,hsttab+hstdat ; get compilation date
.lose ; null creation date?
rot x,12. ; put year last
repeat 3,[
repeat 2,[
movx y,%zeros ; zap character
rotc x,6 ; gobble a character
addx y,<" > ; ASCIIify
ife sailsw\t20sw,.iot tto,y ; output the character
ifn sailsw,outchr y
ifn t20sw,move a1,y ? pbout
];repeat 2
ifn .rpcnt-2,[
ife sailsw\t20sw,.iot tto,["/] ; output a slash
ifn sailsw,outchr ["/]
ifn t20sw,movei a1,"/ ? pbout
];ifn .rpcnt-2
ife .rpcnt-2,[
ife sailsw\t20sw,.iot tto,[" ] ; output a space last time
ifn sailsw,outchr [" ]
ifn t20sw,movei a1,<" > ? pbout
];ife .rpcnt-2
];repeat 3
skipn x,hsttab+hsttim ; get compilation time
.lose ; null compilation time?
repeat 3,[
repeat 2,[
movx y,%zeros ; zap character
rotc x,6 ; gobble a character
addx y,<" > ; ASCIIify
ife sailsw\t20sw,.iot tto,y ; output the character
ifn sailsw,outchr y
ifn t20sw,move a1,y ? pbout
];repeat 2
ifn .rpcnt-2,[
ife sailsw\t20sw,.iot tto,[":] ; delimiter
ifn sailsw,outchr [":]
ifn t20sw,movei a1,": ? pbout
];ifn .rpcnt-2
];repeat 3
type [
]
;Now, for each network print the name of the network
;and print a host map driven off its ADDRESS table.
move a,hsttab+netptr
addi a,hsttab
move b,(a) ;Number of networks
movem b,netcnt'
move b,1(a) ;Words per entry
movem b,netsiz'
addi a,2 ;Address of first network
movem a,netloc'
netprt: sosge netcnt
ife sailsw\t20sw,.logout 1, ;No more networks
ifn sailsw,exit
ifn t20sw,haltf
type [
]
hlrz x,ntlnam(a)
addi x,hsttab
sout
type [ Network:]
hrrz tbl,ntrtab(a)
jumpn tbl,nhashs
type [ no hosts]
nhashs: type [
]
jumpe tbl,skpntp
addi tbl,hsttab
call onenet
skpntp: move a,netsiz
addb a,netloc
jrst netprt
;onenet foo1 foo3 hstprt hstpr1 foo2 cpopj
;Print info for net whose ADDRESS table is pointed to by tbl
onenet: ldb b,[nw$byt,,2+addadr(tbl)] ; Get network number
cain b,nw%dln ; Dialnet is strange
jrst [ type [Phone # ]
jrst foo3]
type [Host # ]
foo3: type [Official Name Machine System
]
skipge d,(tbl) ; load number of entries
.lose ; invalid number of entries?
jumpe d,cpopj ; no hosts this net
skipg c,1(tbl) ; load number of words/entry
.lose ; invalid number of words?
ife sailsw,movei a,-hsttab+2(tbl) ;(Simulate old program)
ifn sailsw,[
movei a,2(tbl)
subi a,hsttab
];ifn sailsw
;a has file-relative address of next ADDRESS table entry to print
hstprt: hlrz b,hsttab+adlsit(a) ; Get SITE entry
movx x,"* ; assume a server
skipl hsttab+stlflg(b) ; but is it really?
movx x,<" > ; nope, a user
ife sailsw\t20sw,.iot tto,x ; initial heading
ifn sailsw,outchr x
ifn t20sw,move a1,x ? pbout
skipn y,hsttab+addadr(a) ; get number of host
.lose ; funny host number?
ldb x,[nw$byt,,y] ; Get network number
caie x,nw%rcc ; RCCnet
cain x,nw%arp ; If Arpanet,
jrst [ldb y,[001000,,y] ; decimal host
movei x,10.
nout
ife sailsw\t20sw,.iot tto,["/]; slash
ifn sailsw,outchr ["/]
ifn t20sw,movei a1,"/ ? pbout
ldb y,[112000,,hsttab+addadr(a)]
movei x,10. ; decimal imp
nout
jrst hstpr1 ]
cain x,nw%chs ; If Chaos net
jrst [ movei x,0 ; Clear subnet
dpb x,[nw$byt,,y]
movei x,4
call octout ; Print right-justified octal
jrst hstpr1 ]
cain x,nw%dln ; If Dialnet
jrst [ movei x,0 ; Clear network
dpb x,[nw$byt,,y]
movei x,hsttab(y) ; get ptr to string
sout ; output the string
jrst hstpr1 ]
cain x,nw%lcs ; If LCSnet,
jrst [ ldb y,[221000,,y] ; octal subnet
movei x,8.
nout
ife sailsw\t20sw,.iot tto,["/]; slash
ifn sailsw,outchr ["/]
ifn t20sw,movei a1,"/ ? pbout
ldb y,[001000,,hsttab+addadr(a)]
movei x,8. ; octal host
nout
jrst hstpr1 ]
cain x,nw%su ; If SUnet
jrst [ ldb y,[111000,,y] ; octal subnet
movei x,8.
nout
ife sailsw\t20sw,.iot tto,["#]; slash
ifn sailsw,outchr ["#]
ifn t20sw,movei a1,"# ? pbout
ldb y,[001000,,hsttab+addadr(a)]
movei x,8. ; octal host
nout
jrst hstpr1 ]
tlz y,777000 ; else output octal number
movei x,8. ; octal host
nout
hstpr1:
ife sailsw\t20sw,.iot tto,[↑I] ; go to next field
ifn sailsw,outchr [↑I]
ifn t20sw,movei a1,↑I ? pbout
hlrz x,hsttab+stlnam(b) ; get name of host
jumpe x,[.lose] ; null host pointer?
addi x,hsttab ; convert to absolute address
sout ; output the string
skipn x,strlen' ; get length of string
.lose ; null host name?
ifn t20sw,movei a1,↑I
caxge x,8. ; more than one field length?
ife sailsw\t20sw,[
.iot tto,[↑I] ; yes, another tab required
.iot tto,[↑I] ; output another tab
];ife sailsw\t20sw
ifn sailsw,[
outchr [↑I]
outchr [↑I]
];ifn sailsw
ifn t20sw,pbout ? pbout
hrrz x,hsttab+strmch(b) ; get machine host is
jumpe x,[ movei x,[asciz/UNKNOWN/]; unknown name
jrst .+2] ; and continue
addi x,hsttab ; convert to absolute address
move y,(x) ; get first word of machine name
andx y,777777700000 ; get first three characters
caxe y,ascii/PDP/ ; is this a PDP-nn?
jrst foo2
ldb y,[100700,,(x)] ; yes, get fourth character
caxn y,"- ; is it a dash?
jrst foo2 ; yes (foo, somebody lost!)
save x ; save current pointer
type [PDP-]
retr x ; get current pointer back
hrli x,170700 ; kludge up byte pointer after PDP
foo2: sout ; and output it
skipn x,strlen' ; get length of string
.lose ; null host name?
ifn t20sw,movei a1,↑I
caxge x,8. ; more than one field length?
ife sailsw\t20sw,[
.iot tto,[↑I] ; yes, another tab needed
.iot tto,[↑I] ; output a delimiting tab
];ife sailsw\t20sw
ifn sailsw,[
outchr [↑I]
outchr [↑I]
];ifn sailsw
ifn t20sw,pbout ? pbout
hlrz x,hsttab+stlsys(b) ; get system host has
jumpe x,[ movei x,[asciz/UNKNOWN/]; unknown system
jrst .+2] ; and continue
addi x,hsttab ; convert to absolute address
sout ; and output it
type [
]
addi a,(c) ; go to next entry in the table
sojg d,hstprt ; loop for next entry
type [
* means this site is a server
]
cpopj: return
; Generate literals
variables ? constants
ife sailsw,hsttab=<.+1777>&-2000 ; start of host table
ifn sailsw,hsttab=.
end HOSTAB